package com.edu.exam.entity.quality.audit;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.time.LocalDateTime;

/**
 * 审核流程配置实体类
 *
 * <p>审核流程配置实体用于定义审核流程的结构和规则，包括流程基本信息、
 * 版本管理、生效时间、配置参数等。支持多版本管理和动态配置。</p>
 *
 * <p>核心功能：
 * - 流程定义：定义审核流程的基本信息和类型
 * - 版本管理：支持流程配置的版本控制
 * - 规则配置：配置审核流程的业务规则
 * - 权限管理：配置流程相关的权限和角色</p>
 *
 * @author 系统生成
 * @version 2.0
 * @since 2025-11-09
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@EntityListeners(AuditingEntityListener.class)
public class AuditProcessConfig {

    /**
     * 主键ID
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * 流程名称
     *
     * <p>审核流程的名称，用于标识和显示。
     * 应该简洁明了地描述流程的用途和适用范围。</p>
     */
    @Column(name = "process_name", nullable = false, length = 100)
    private String processName;

    /**
     * 流程描述
     *
     * <p>审核流程的详细描述，说明流程的用途、适用场景、
     * 审核要求等信息。</p>
     */
    @Column(name = "process_description", columnDefinition = "TEXT")
    private String processDescription;

    /**
     * 流程类型
     *
     * <p>审核流程的类型标识，用于区分不同类型的审核流程。
     * 支持的类型包括：STANDARD（标准审核）、SIMPLIFIED（简化审核）、URGENT（紧急审核）等。</p>
     */
    @Column(name = "process_type", nullable = false, length = 20)
    private String processType;

    /**
     * 状态
     *
     * <p>流程配置的状态标识。
     * 支持的状态包括：DRAFT（草稿）、ACTIVE（激活）、INACTIVE（停用）、DELETED（删除）等。</p>
     */
    @Column(name = "status", nullable = false, length = 20)
    private String status = "DRAFT";

    /**
     * 版本号
     *
     * <p>流程配置的版本号，用于版本管理。
     * 支持语义化版本号格式，如：1.0.0、1.1.0等。</p>
     */
    @Column(name = "version", nullable = false, length = 20)
    private String version = "1.0.0";

    /**
     * 创建人ID
     *
     * <p>创建流程配置的用户ID，关联系统用户表。
     * 用于记录配置的创建责任人。</p>
     */
    @Column(name = "creator_id", nullable = false)
    private Long creatorId;

    /**
     * 创建人姓名
     *
     * <p>创建流程配置的用户姓名，用于显示和记录。
     * 冗余存储用户姓名，避免频繁关联查询用户表。</p>
     */
    @Column(name = "creator_name", nullable = false, length = 100)
    private String creatorName;

    /**
     * 修改人ID
     *
     * <p>最后修改流程配置的用户ID。
     * 用于记录配置的修改责任人。</p>
     */
    @Column(name = "modifier_id")
    private Long modifierId;

    /**
     * 修改人姓名
     *
     * <p>最后修改流程配置的用户姓名。
     * 冗余存储用户姓名，避免频繁关联查询用户表。</p>
     */
    @Column(name = "modifier_name", length = 100)
    private String modifierName;

    /**
     * 生效日期
     *
     * <p>流程配置的生效时间，在此时间之后配置开始生效。
     * 可选字段，用于控制配置的生效时间。</p>
     */
    @Column(name = "effective_date")
    private LocalDateTime effectiveDate;

    /**
     * 失效日期
     *
     * <p>流程配置的失效时间，在此时间之后配置失效。
     * 可选字段，用于控制配置的有效期。</p>
     */
    @Column(name = "expiry_date")
    private LocalDateTime expiryDate;

    /**
     * 配置数据
     *
     * <p>JSON格式的流程配置参数。
     * 包含流程的详细配置信息，如步骤配置、规则配置等。</p>
     */
    @Column(name = "config_data", columnDefinition = "TEXT")
    private String configData;

    /**
     * 规则配置
     *
     * <p>JSON格式的审核规则配置。
     * 包含审核流程的业务规则、条件判断、处理逻辑等。</p>
     */
    @Column(name = "rule_config", columnDefinition = "TEXT")
    private String ruleConfig;

    /**
     * 是否系统默认
     *
     * <p>标识是否为系统默认的流程配置。
     * true表示系统默认配置，false表示用户自定义配置。</p>
     */
    @Column(name = "is_system_default", nullable = false)
    private Boolean isSystemDefault = false;

    /**
     * 是否激活
     *
     * <p>标识流程配置是否处于激活状态。
     * true表示激活状态，false表示停用状态。</p>
     */
    @Column(name = "is_active", nullable = false)
    private Boolean isActive = false;

    /**
     * 是否删除
     *
     * <p>软删除标记，标识记录是否已删除。
     * true表示已删除，false表示未删除。</p>
     */
    @Column(name = "is_deleted", nullable = false)
    private Boolean isDeleted = false;

    // ===== 审计字段 =====

    /**
     * 创建时间
     */
    @CreatedDate
    @Column(name = "created_time", nullable = false, updatable = false)
    private LocalDateTime createdTime;

    /**
     * 更新时间
     */
    @LastModifiedDate
    @Column(name = "updated_time", nullable = false)
    private LocalDateTime updatedTime;

    // ===== 常量定义 =====

    // 流程类型常量
    /** 流程类型 - 标准审核 */
    public static final String TYPE_STANDARD = "STANDARD";

    /** 流程类型 - 简化审核 */
    public static final String TYPE_SIMPLIFIED = "SIMPLIFIED";

    /** 流程类型 - 紧急审核 */
    public static final String TYPE_URGENT = "URGENT";

    /** 流程类型 - 批量审核 */
    public static final String TYPE_BATCH = "BATCH";

    // 状态常量
    /** 状态 - 草稿 */
    public static final String STATUS_DRAFT = "DRAFT";

    /** 状态 - 激活 */
    public static final String STATUS_ACTIVE = "ACTIVE";

    /** 状态 - 停用 */
    public static final String STATUS_INACTIVE = "INACTIVE";

    /** 状态 - 删除 */
    public static final String STATUS_DELETED = "DELETED";

}